// 配置全局的基础配置
import axios from "axios";
import globalConfig from "../global.config";
import router from "@/router";
import CryptoJS from 'crypto-js';
import { Message , Loading } from "element-ui";
// baseURL,timeout,headers,responseType,withCredentials
//   创建axios实例 后面的请求用request发
let request = axios.create({
  baseURL: "http://localhost:5000",
  timeout: 30 * 1000,
  headers: {
    // "Content-Type": "application/json;charset=utf-8",
  },
});


// loading全局配置
let loading;
console.log('loading-1', loading);

function startLoading(){
  loading = Loading.service({
    lock: true,
    text: "Loading...",
    // background: "rgba(0,0,0,0.7)"
  });
  console.log('loading-2', loading);
}
function endLoading() {
  // Todo-bug: loading实例里面没有close方法
  // console.log('loading-3', loading.close());
  loading.close();
}


// 使用：请求时加载，

// 添加请求拦截器
// token、密钥设置
// 1、通过global.config.js文件设置白名单，确定哪些页面不需要token
request.interceptors.request.use(
  (config) => {
    // 加载动画
    startLoading();

    let whiteList = globalConfig.whiteListApi;
    let url = config.url;
    let token = localStorage.getItem("token");//假设token存储在localStorage中
    if (whiteList.indexOf(url) === -1 && token) {
      // 如果不在白名单中且没有token，则需要设置token
      config.headers.Authorization = token;
    }
    // 设置密钥
    // 为避免请求伪造，通过secretId + MD5算法，保障请求通过项目发送
    let _secret = globalConfig.secretId + new Date() + toString();
    config.headers.secret = CryptoJS.MD5(_secret).toString();//将密钥加到请求头中
    return config;
  },
  (error) => {
    // 请求出错如何处理
    return Promise.reject(new Error(error));
  }
);
//添加响应拦截器
request.interceptors.response.use(
  (response) => {
    // 结束加载动画
    endLoading();
    // 响应的统一处理
    const status = response.data.status || 200;
    const message = response.data.message || "请求失败";
    // 遇到401状态码时，常见的做法是重定向到登录页面，或者弹出登录框要求用户重新登录。
    if(status === 401) {
      alert("token失效，请重新登录");
      router.push("/login");
      return Promise.reject(new Error(message));
    }
    if(status !== 200) {
      // 真实项目需要将alert替换为错误提示组件
      alert("错误码" + status + ":" + message);
      return Promise.reject(new Error(message));
    }
    return response;
  },
  (error) => {
    console.log('2222222222222222');
    // console.log('error', error.response.data.message);
    // 响应出错如何处理
    Message.error("请求出错：" + error.response.data.message);
    endLoading();
    return Promise.reject(new Error(error));
  }
)








export default request;